#ifndef __BSP_LTDC_H__
#define __BSP_LTDC_H__

#include "bsp.h"

/* 选择是否使用8寸800X1280RGB屏
 * 0: 没有使用8寸RGB屏
 * 1: 使用8寸RGB屏
 */
#define RGB_80_8001280       0     /* 默认不使用8寸800X1280RGB屏 */


/* LCD LTDC重要参数集 */
typedef struct  
{
    uint32_t pwidth;       /* LTDC面板的宽度,固定参数,不随显示方向改变,如果为0,说明没有任何RGB屏接入 */
    uint32_t pheight;      /* LTDC面板的高度,固定参数,不随显示方向改变 */
    uint16_t hsw;          /* 水平同步宽度 */
    uint16_t vsw;          /* 垂直同步宽度 */
    uint16_t hbp;          /* 水平后廊 */
    uint16_t vbp;          /* 垂直后廊 */
    uint16_t hfp;          /* 水平前廊 */
    uint16_t vfp;          /* 垂直前廊  */
    uint8_t activelayer;   /* 当前层编号:0/1 */
    uint8_t dir;           /* 0,竖屏;1,横屏; */
    uint16_t width;        /* LTDC宽度 */
    uint16_t height;       /* LTDC高度 */
    uint32_t pixsize;      /* 每个像素所占字节数 */
    uint8_t pixformat;     /* 颜色像素格式 */
}_ltdc_dev; 

extern _ltdc_dev lcdltdc;                     /* 管理LCD LTDC参数 */
extern LTDC_HandleTypeDef g_ltdc_handle;      /* LTDC句柄 */
extern DMA2D_HandleTypeDef g_dma2d_handle;    /* DMA2D句柄 */

#define LTDC_PIXFORMAT_ARGB8888      0X00     /* ARGB8888格式 */
#define LTDC_PIXFORMAT_RGB888        0X01     /* RGB888格式 */
#define LTDC_PIXFORMAT_RGB565        0X02     /* RGB565格式 */
#define LTDC_PIXFORMAT_ARGB1555      0X03     /* ARGB1555格式 */
#define LTDC_PIXFORMAT_ARGB4444      0X04     /* ARGB4444格式 */
#define LTDC_PIXFORMAT_L8            0X05     /* L8格式 */
#define LTDC_PIXFORMAT_AL44          0X06     /* AL44格式 */
#define LTDC_PIXFORMAT_AL88          0X07     /* AL88格式 */

/* 定义颜色像素格式,一般用RGB565 */
#define LTDC_PIXFORMAT           LTDC_PIXFORMAT_RGB565

/* 定义默认背景层颜色 */
#define LTDC_BACKLAYERCOLOR      0X00000000

/* LTDC帧缓冲区首地址,这里定义在SDRAM里面. */
#define LTDC_FRAME_BUF_ADDR      0XC0000000  

/******************************************************************************************/
/* LTDC_DE/VSYNC/HSYNC/CLK/BL/RST 引脚 定义 
 * LTDC_R0~R7, G0~G7, B0~B7,由于引脚太多,就不在这里定义了,直接在ltcd_init里面修改.所以在移植的时候,
 * 除了改这6个IO口, 还得改ltcd_init里面的R0~R7, G0~G7, B0~B7所在的IO口.
 */

 #define LTDC_DE_GPIO_PORT               GPIOF
 #define LTDC_DE_GPIO_PIN                GPIO_PIN_10
 #define LTDC_DE_GPIO_CLK_ENABLE()       do{ __HAL_RCC_GPIOF_CLK_ENABLE(); }while(0)    /* 所在IO口时钟使能 */
 
 #define LTDC_VSYNC_GPIO_PORT            GPIOI
 #define LTDC_VSYNC_GPIO_PIN             GPIO_PIN_9
 #define LTDC_VSYNC_GPIO_CLK_ENABLE()    do{ __HAL_RCC_GPIOI_CLK_ENABLE(); }while(0)    /* 所在IO口时钟使能 */
 
 #define LTDC_HSYNC_GPIO_PORT            GPIOI
 #define LTDC_HSYNC_GPIO_PIN             GPIO_PIN_10
 #define LTDC_HSYNC_GPIO_CLK_ENABLE()    do{ __HAL_RCC_GPIOI_CLK_ENABLE(); }while(0)    /* 所在IO口时钟使能 */
 
 #define LTDC_CLK_GPIO_PORT              GPIOG
 #define LTDC_CLK_GPIO_PIN               GPIO_PIN_7
 #define LTDC_CLK_GPIO_CLK_ENABLE()      do{ __HAL_RCC_GPIOG_CLK_ENABLE(); }while(0)    /* 所在IO口时钟使能 */
 
 #define LTDC_BL_GPIO_PORT               GPIOB
 #define LTDC_BL_GPIO_PIN                GPIO_PIN_5
 #define LTDC_BL_GPIO_CLK_ENABLE()       do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0)    /* 所在IO口时钟使能 */
 
 #define LTDC_RST_GPIO_PORT              GPIOD
 #define LTDC_RST_GPIO_PIN               GPIO_PIN_11
 #define LTDC_RST_GPIO_CLK_ENABLE()      do{ __HAL_RCC_GPIOD_CLK_ENABLE(); }while(0)    /* 所在IO口时钟使能 */
 
 /* LTDC背光控制 */
 #define LTDC_BL(x)      do{ x ? \
     HAL_GPIO_WritePin(LTDC_BL_GPIO_PORT, LTDC_BL_GPIO_PIN, GPIO_PIN_SET) : \
     HAL_GPIO_WritePin(LTDC_BL_GPIO_PORT, LTDC_BL_GPIO_PIN, GPIO_PIN_RESET); \
 }while(0)
 
 /* LTDC复位引脚 */
 #define LTDC_RST(x)     do{ x ? \
     HAL_GPIO_WritePin(LTDC_RST_GPIO_PORT, LTDC_RST_GPIO_PIN, GPIO_PIN_SET) : \
     HAL_GPIO_WritePin(LTDC_RST_GPIO_PORT, LTDC_RST_GPIO_PIN, GPIO_PIN_RESET); \
 }while(0)
 

void bsp_InitLTDC(void);

void ltdc_switch(uint8_t sw);
uint16_t ltdc_panelid_read(void);
void ltdc_clear(uint32_t color);
void ltdc_display_dir(uint8_t dir);
void ltdc_draw_point(uint16_t x, uint16_t y, uint32_t color);                                                   /* LTDC画点函数 */
uint32_t ltdc_read_point(uint16_t x, uint16_t y);        
void ltdc_fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint32_t color);                             /* ���ε�ɫ���, DMA2D��� */
void ltdc_color_fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t *color); 



#endif
